//<p>给你一个整数数组&nbsp;<code>nums</code>，返回 <em>数组&nbsp;<code>answer</code>&nbsp;，其中&nbsp;<code>answer[i]</code>&nbsp;等于&nbsp;<code>nums</code>&nbsp;中除&nbsp;<code>nums[i]</code>&nbsp;之外其余各元素的乘积</em>&nbsp;。</p>
//
//<p>题目数据 <strong>保证</strong> 数组&nbsp;<code>nums</code>之中任意元素的全部前缀元素和后缀的乘积都在&nbsp; <strong>32 位</strong> 整数范围内。</p>
//
//<p>请<strong>不要使用除法，</strong>且在&nbsp;<code>O(<em>n</em>)</code> 时间复杂度内完成此题。</p>
//
//<p>&nbsp;</p>
//
//<p><strong>示例 1:</strong></p>
//
//<pre>
//<strong>输入:</strong> nums = <span><code>[1,2,3,4]</code></span>
//<strong>输出:</strong> <span><code>[24,12,8,6]</code></span>
//</pre>
//
//<p><strong>示例 2:</strong></p>
//
//<pre>
//<strong>输入:</strong> nums = [-1,1,0,-3,3]
//<strong>输出:</strong> [0,0,9,0,0]
//</pre>
//
//<p>&nbsp;</p>
//
//<p><strong>提示：</strong></p>
//
//<ul> 
// <li><code>2 &lt;= nums.length &lt;= 10<sup>5</sup></code></li> 
// <li><code>-30 &lt;= nums[i] &lt;= 30</code></li> 
// <li><strong>保证</strong> 数组&nbsp;<code>nums</code>之中任意元素的全部前缀元素和后缀的乘积都在&nbsp; <strong>32 位</strong> 整数范围内</li> 
//</ul>
//
//<p>&nbsp;</p>
//
//<p><strong>进阶：</strong>你可以在 <code>O(1)</code>&nbsp;的额外空间复杂度内完成这个题目吗？（ 出于对空间复杂度分析的目的，输出数组<strong>不被视为</strong>额外空间。）</p>
//
//<div><div>Related Topics</div><div><li>数组</li><li>前缀和</li></div></div><br><div><li>👍 1231</li><li>👎 0</li></div>

package com.rising.leetcode.editor.cn;

/**
 * 除自身以外数组的乘积
 * @author DY Rising
 * @date 2022-08-17 20:20:02
 */
public class P238_ProductOfArrayExceptSelf{
    public static void main(String[] args) {
        //测试代码
        Solution solution = new P238_ProductOfArrayExceptSelf().new Solution();
    }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int[] productExceptSelf(int[] nums) {
        //定义一个出参数组
        int[] ans = new int[nums.length];
        //先遍历，将ans每个元素设置为，当前索引左边所有值的乘积
        //0左边没有元素作为1
        ans[0] = 1;
        for (int i = 1; i < ans.length; i++) {
            ans[i] = ans[i - 1] * nums[i - 1];
        }
        //倒叙遍历，记录R，R代表当前索引右边的乘积，初始R=1
        int R = nums[nums.length - 1];
        for (int i = ans.length - 1; i > 0; i--) {
            ans[i - 1] = ans[i - 1] * R;
            R = nums[i - 1] * R;
        }
        return ans;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
